<%@ page pageEncoding="UTF-8" %>
<%@ page import="util.*" %>
<%@ page import="entidades.*" %>

<%@ page import="java.util.Map" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.LinkedList" %>
<%@ page import="java.util.GregorianCalendar" %>
<%@ page import="com.google.gson.Gson" %>

<%
String svc = request.getParameter("service");
if(svc != null)
    {
	String resultado = "";

	try{
		// El servicio 'load' carga los datos de una entidad.
		if(svc.compareTo("load") == 0)
			{
			String id = request.getParameter("id");
			CicloNewlong ciclo = new CicloNewlong(id);

			if(ciclo.getId() != 0)
				{
				HashMap map = new HashMap();
				map.put("code", 0);
				map.put("ciclo", ciclo);
				map.put("cantidad", ciclo.getCapacidad());
				map.put("fechaInicio", ciclo.getFechaHoraInicioToString());
				map.put("fechaFin", ciclo.getFechaHoraFinToString());
				map.put("proporciones", EtapaNewlong.listarExt(ciclo.getId()));
				resultado = new Gson().toJson(map);
				}
			else
				{ resultado = Json.getErrorMsj("No existe ningun ciclo con id = " + id); }
			}

		// El servicio 'save' guarda los datos de una entidad.
		if(svc.compareTo("save") == 0)
			{
			// Verifico si se esta creando o modificando un ciclo.
			int id = 0;
			try{ id = Integer.parseInt(request.getParameter("id")); }catch(Exception e) {}

			if(id <= 0)
				{
				// Es un alta.
				List<Map> proporciones = new LinkedList();
				if(request.getParameter("proporciones") != null)
					{
					String[] proporcionesAux = request.getParameter("proporciones").split(";");
					for(int i=0; i<proporcionesAux.length; i++)
						{
						String[] valores = proporcionesAux[i].split("_");
						if(valores.length >= 5)
							{
							Map etapa = new HashMap();
							etapa.put("formatoId", Integer.parseInt(valores[0]));
							etapa.put("orden", Integer.parseInt(valores[1]));
							etapa.put("cantidad", Long.parseLong(valores[2]));
							proporciones.add(etapa);
							}
						}

					// Guardo el ciclo.
					CicloNewlong ciclo = new CicloNewlong();
					ciclo.setNewlongId( request.getParameter("newlong_id") );
					ciclo.setNumero( request.getParameter("numero") );
					ciclo.setFechaHoraInicio( request.getParameter("fecha_inicio") );
					ciclo.setFechaHoraFin( request.getParameter("fecha_fin") );
					ciclo.setBloqueado( request.getParameter("bloqueado"));
					ciclo.guardar(proporciones);
					}
				}
			else
				{
				// Es una modificacion.
				CicloNewlong ciclo = new CicloNewlong(id);
				ciclo.bloquear(Util.parseBoolean(request.getParameter("bloqueado")), Util.parseBoolean(request.getParameter("compactar")));
				}

			resultado = Json.getOkMsj();
			}

		// El servicio 'delete' elimina a una entidad.
		if(svc.compareTo("delete") == 0)
			{
			CicloNewlong.borrar( request.getParameter("id") );
			resultado = Json.getOkMsj();
			}

		// El servicio 'valoresPorDefecto' busca los valores por defecto.
		if(svc.compareTo("valoresPorDefecto") == 0)
			{
			// Obtengo los datos.
			int id = Util.parseInt(request.getParameter("id"));
			int newlongId = Util.parseInt(request.getParameter("newlong_id"));
			long cantidad = Util.parseLong(request.getParameter("cantidad"));
			int numero = Util.parseInt(request.getParameter("numero"));
			Date fechaInicio = Util.parseDatetime(request.getParameter("fecha_inicio"));
			Date fechaFin = Util.parseDatetime(request.getParameter("fecha_fin"));
			boolean sobreescribirFechas = Util.parseBoolean(request.getParameter("sobrescribirFechas"));

			// Si no tiene un numero, se lo asigno.
			if(numero <= 0) { numero = CicloNewlong.getProximoNumero(newlongId); }

			// Si las fechas son nulas o se deben sobreescribir, les asigno el valor por defecto.
			if(fechaInicio == null || sobreescribirFechas)
				{
				fechaInicio = CicloNewlong.getUltimaFecha(newlongId);
				if(fechaInicio.getTime() < new Date().getTime()) fechaInicio = new Date();
				}
			if(fechaFin == null || sobreescribirFechas)
				{
				long dias = (long)Estacionalidad.getDiasCiclo(newlongId, fechaInicio);
				fechaFin = new Date( fechaInicio.getTime() + dias*86400000 );
				}
			if(fechaInicio.getTime() > fechaFin.getTime()) {fechaFin = fechaInicio;}

			// Obtengo cantidad del ciclo.
			cantidad = Newlong.getCapacidad(newlongId, fechaInicio, fechaFin);

			// Calculo la cantidad y las fechas de cada formato.
			List<Map> proporciones = EtapaNewlong.calcularFechasYCantidades(newlongId, fechaInicio, fechaFin);

			// Guardo los datos.
			HashMap map = new HashMap();
			map.put("code", 0);
			map.put("cantidad", cantidad);
			map.put("numero", numero);
			map.put("fecha_inicio", Util.format(fechaInicio, "dd/MM/yyyy HH:mm"));
			map.put("fecha_fin", Util.format(fechaFin, "dd/MM/yyyy HH:mm"));
			map.put("proporciones", proporciones);

			resultado = new Gson().toJson(map);
			}


		// El servicio 'new' busca los valores por defecto para crear un ciclo.
		if(svc.compareTo("new") == 0)
			{
			int newlongId = Util.parseInt(request.getParameter("newlong"));
			
			// Obtengo las fechas de inicio y de fin.
			GregorianCalendar fechaInicio = new GregorianCalendar();
			GregorianCalendar fechaFin = new GregorianCalendar();
			fechaInicio.setTime(CicloNewlong.getUltimaFecha(newlongId));
			fechaFin.setTime(CicloNewlong.getUltimaFecha(newlongId));
			fechaFin.add(GregorianCalendar.DATE, Estacionalidad.getDiasCiclo(newlongId, fechaInicio.getTime()));
			
			// Obtengo el orden y proporción de cada etapa.
			List<FormatosPorNewlong> formatos = FormatosPorNewlong.listar(newlongId);
			List<Map> etapas = new LinkedList();
			for(int i=0; i<formatos.size(); i++)
				{
				HashMap etapa = new HashMap();
				etapa.put("formatoId", formatos.get(i).getFormatoId());
				etapa.put("formato", formatos.get(i).getFormato().toString());
				etapa.put("proporcion", formatos.get(i).getProporcion());
				etapa.put("orden", formatos.get(i).getOrden());
				etapas.add(etapa);
				}
			
			// Imprimo los resultados.
			HashMap map = new HashMap();
			map.put("code", 0);
			map.put("capacidad", Newlong.getCapacidad(newlongId, fechaInicio.getTime(), fechaFin.getTime()));
			map.put("numero", CicloNewlong.getProximoNumero(newlongId));
			map.put("fecha_inicio", Util.format(fechaInicio.getTime(), "dd/MM/yyyy HH:mm"));
			map.put("fecha_fin", Util.format(fechaFin.getTime(), "dd/MM/yyyy HH:mm"));
			map.put("etapas", etapas);
			
			resultado = new Gson().toJson(map);
			}

		// El servicio 'capacidad' obtiene la capacidad de una Newlong entre dos fechas dadas.
		if(svc.compareTo("capacidad") == 0)
			{
			int newlongId = Util.parseInt(request.getParameter("newlong"));
			long metros = Util.parseLong(request.getParameter("bolsas"));
			Date fechaInicio = Util.parseDatetime(request.getParameter("fecha_inicio"));
			Date fechaFin = Util.parseDatetime(request.getParameter("fecha_fin"));
			
			HashMap map = new HashMap();
			map.put("code", 0);
			map.put("capacidad", Newlong.getCapacidad(newlongId, fechaInicio, fechaFin));
			map.put("fecha_fin_min", Util.format(Newlong.calcularFechaFin(newlongId, fechaInicio, metros), "dd/MM/yyyy HH:mm"));

			resultado = new Gson().toJson(map);
			}

		// El servicio 'etapas' obtiene las etapas de un ciclo.
		if(svc.compareTo("etapas") == 0)
			{
			List<Map> etapas = new LinkedList();
			List<EtapaNewlong> etapasTmp = EtapaNewlong.listar(Util.parseInt(request.getParameter("id")));
			
			for(int i=0; i<etapasTmp.size(); i++)
				{
				Map e = new HashMap();
				e.put("orden", etapasTmp.get(i).getOrden());
				e.put("formatoId", etapasTmp.get(i).getFormatoId());
				e.put("formato", etapasTmp.get(i).getFormato().toString());
				e.put("cantidad", etapasTmp.get(i).getCantidad());
				e.put("ocupado", etapasTmp.get(i).getOcupado());
				etapas.add(e);
				}
			
			HashMap map = new HashMap();
			map.put("code", 0);
			map.put("etapas", etapas);

			resultado = new Gson().toJson(map);
			}
		
		}catch(Exception e)
			{ resultado = Json.getErrorMsj(e); }

	out.print(resultado);
    }
%>
